﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RzCorportativo.DataAccess;

namespace RzCorportativo.Lib
{
    public class Curriculo
    {        
        RzCorportativo.DataAccess.Curriculo model;
        
        public static Curriculo CreateInstace(long curriculoId)
        {
            RzCorportativo.DataAccess.SistemaCurricularEntities db = new SistemaCurricularEntities();
            var p = db.Curriculo.Where(w => w.CurriculoId == curriculoId).FirstOrDefault();
            var item = new Curriculo();
            if (p != null)
                item = item.Create(p);
            return item;
        }

        public bool IsNew { get { return this.CurriculoId == 0; } }

        public DateTime DataCadastro { get; set; }

        public long CurriculoId { get; set; }

        public long UsuarioId { get; set; }

        public short DisponibilidadeHorario { get; set; }

        public decimal PretencaoSalarial { get; set; }

        public List<Cargo> Cargos { get; set; }

        public Usuario Usuario { get; set; }

        public bool Salvar()
        {
            bool @result = false;
            Transaction.Begin((entity) =>
            {                
                if (this.IsNew)
                {
                    Lib.Curriculo curriculo = new Lib.Curriculo();
                    if (this.Usuario != null && this.Usuario.Login != null && this.Usuario.Login.TipoLogin == TipoLogin.Candidato)
                    {
                        if (!this.Usuario.Salvar())
                            throw new Exception("Falha ao salvar o usuário");
                        this.UsuarioId = this.Usuario.UsuarioId;
                    }
                    this.model = this.Insert(entity);
                }
                else
                    this.model = this.Update(entity);
                return true;
            }).OnError((ex) =>
            {
                throw ex;
            }).OnSuccess(() =>
            {
                @result = true;
                this.UsuarioId = this.model.UsuarioId;
            });
            return @result;
        }

        private DataAccess.Curriculo Insert(SistemaCurricularEntities entity)
        {
            var @item = this.CreateModel(entity);
            entity.AddToCurriculo(@item);
            return @item;
        }

        private DataAccess.Curriculo Update(SistemaCurricularEntities entity)
        {
            var @item = this.CreateModel(entity);
            return @item;
        }

        private DataAccess.Curriculo CreateModel(SistemaCurricularEntities entity)
        {
            DataAccess.Curriculo curriculo = new DataAccess.Curriculo();
            if (!this.IsNew)
            {
                curriculo = entity.Curriculo.Where(w => w.CurriculoId == this.CurriculoId).FirstOrDefault();
                if (curriculo == null)
                    throw new Exception("Código inválido");
            }
            curriculo.CurriculoId = this.CurriculoId;
            if (this.IsNew)
            {
                this.DataCadastro = DateTime.Now;
                curriculo.DataCadastro = this.DataCadastro;
            }
            curriculo.UsuarioId = this.UsuarioId;
            curriculo.PretencaoSalarial = this.PretencaoSalarial;
            curriculo.DisponibilidadeHorario = this.DisponibilidadeHorario;
            return curriculo;
        }

        internal Curriculo Create(DataAccess.Curriculo item)
        {
            if (item == null)
                return null;
            var curriculo = new Curriculo();
            curriculo.UsuarioId = item.UsuarioId;
            curriculo.Usuario = new Usuario().Create(item.Usuario);
            curriculo.CurriculoId = item.CurriculoId;
            curriculo.DataCadastro = item.DataCadastro;
            curriculo.PretencaoSalarial = item.PretencaoSalarial;
            curriculo.DisponibilidadeHorario = item.DisponibilidadeHorario;
            curriculo.Cargos = item.Cargo.ToList().Select(f => new Lib.Cargo().Create(f)).ToList();
            return curriculo;
        }

        public static List<Curriculo> Listar(Curriculo curriculo)
        {
            if (curriculo == null)
                curriculo = new Curriculo();
            List<Curriculo> lista = new List<Curriculo>();
            var db = new SistemaCurricularEntities();
            lista = db.Curriculo.Where(w =>
                    ((curriculo.UsuarioId == 0) || (curriculo.UsuarioId == w.UsuarioId)) &&
                    ((curriculo.CurriculoId == 0) || (curriculo.CurriculoId == w.CurriculoId))
                ).ToList().Select(s => curriculo.Create(s)).ToList();
            return lista;
        }

        public bool AddCargoPretendido(Cargo cargo)
        {
            bool retorno = false;
            Transaction.Begin((context) =>
            {
                var model = context.Curriculo.FirstOrDefault(f => f.CurriculoId == this.CurriculoId);
                var newCargo = context.Cargo.FirstOrDefault(f => f.CargoId == cargo.CargoId);
                if (newCargo == null)
                    throw new Exception("Cargo inválido");
                model.Cargo.Add(newCargo);
                return true;
            }).OnError((ex) =>
            {
                throw ex;
            }).OnSuccess(() =>
            {
                retorno = true;
            });
            return retorno;
        }

        public bool RemoveCargo(Cargo cargo)
        {
            bool retorno = false;
            Transaction.Begin((context) =>
            {
                var model = context.Curriculo.FirstOrDefault(f => f.CurriculoId == this.CurriculoId);
                var newCargo = context.Cargo.FirstOrDefault(f => f.CargoId == cargo.CargoId);
                if (newCargo == null)
                    throw new Exception("Cargo inválido");
                model.Cargo.Remove(newCargo);
                return true;
            }).OnError((ex) =>
            {
                throw ex;
            }).OnSuccess(() =>
            {
                retorno = true;
            });
            return retorno;
        }
    }
}
